package com.example.lasttrain;

import java.util.Calendar;
import java.util.Date;

import com.example.lasttrain.common.DatabaseUtils;
import com.example.lasttrain.common.Defines;
import com.example.lasttrain.common.SpinnerSettings;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.util.Log;
import android.widget.Toast;

public class AlarmManageStart{

    private AlarmManager alarmManager;
    private Calendar calendar;
    private Calendar calendar2;
    private int cal_hour;
    private int cal_minute;
    Context context;
    
	public AlarmManageStart(Context context){
		this.context = context;
	}
    
	/** アラーム設定メソッド */
	public void onCreateAlarm(boolean onOff, int hour, int minute, int alarmIndex, int id) {
        
        /** ON_OFFで設定か解除を切り分け */
        if(onOff == true){
        	// アラームの設定 
            startAlarm(hour, minute, alarmIndex, id);
        }else{
        	// アラームの解除 
            stopAlarm(id);
        }
   }
  
   /** アラーム開始 */
   public void startAlarm(int tHour, int tMinute, int alarmIndex, int id) {
        Log.d("AlarmTestActivity", "startAlarm()");
       
        alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        // 現在の年月日をカレンダーに設定 
        calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        Date date = calendar.getTime();
        date.setHours(cal_hour);
        date.setMinutes(cal_minute);
        calendar.setTimeInMillis(System.currentTimeMillis());
        
        // alarmIndexにセットされているindexを何分前に変更
        SpinnerSettings spinner = new SpinnerSettings();
        int alarmTime = spinner.getAlarmTime(alarmIndex);
        
        // 終電時刻と何分前からアラーム連動時刻を計算（alarmTimeは60分以内を想定）
        // 何分前を差し引いてマイナスになるなら、時間繰り下げ
        if ((tMinute - alarmTime) < 0){
        	cal_hour = tHour -1;
        	cal_minute = (tMinute - alarmTime) + 60;
        }else{
        	// 繰り下げにならない時はそのままセット
        	cal_hour = tHour;
        	cal_minute = tMinute - alarmTime;
        }
        
        //設定予定時刻をセット
        calendar2 = Calendar.getInstance();
        calendar2.setTimeInMillis(System.currentTimeMillis());
        calendar2.set(Calendar.HOUR_OF_DAY, cal_hour);
        calendar2.set(Calendar.MINUTE, cal_minute );
        calendar2.set(Calendar.SECOND, 0);
        calendar2.set(Calendar.MILLISECOND, 0);
        
        // 既にアラーム時刻を過ぎているなら翌日にセット
        int diff = calendar.compareTo(calendar2);
        if (diff > 0){
        	// 現在時刻は設定時刻より進んでいるので翌日をセット
        	calendar2.add(Calendar.DAY_OF_MONTH, 1);
          }else{
        	// 現在時刻と設定時刻は同じもしくは設定時刻の方が未来なので、補正しない
          }
        
        // アラームに登録 
        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar2.getTimeInMillis(), getPendingIntent(id));
        
        // DBのアラームフラグをONにセット
        DatabaseUtils.alarmContents(context, id, 1);
        
        // 設定時刻を算出
        String year = Integer.toString(calendar2.get(Calendar.YEAR));        //(2)現在の年を取得
        String month = Integer.toString(calendar2.get(Calendar.MONTH) + 1);  //(3)現在の月を取得
        String day = Integer.toString(calendar2.get(Calendar.DATE));         //(4)現在の日を取得
        String hour = Integer.toString(calendar2.get(Calendar.HOUR_OF_DAY)); //(5)現在の時を取得
        String minute = Integer.toString(calendar2.get(Calendar.MINUTE));    //(6)現在の分を取得
        String second = Integer.toString(calendar2.get(Calendar.SECOND));    //(7)現在の秒を取得
        String yyyymmdd = day + "日の" + hour + "：" + minute;
        
		// メッセージを表示
		Toast.makeText(context, "アラームを" + yyyymmdd + "に設定しました", Toast.LENGTH_LONG).show();
        
   }
  
   /** アラームストップ */
   public void stopAlarm(int id) {
        Log.d("AlarmTestActivity", "stopAlarm()");
       
         // 登録してあるアラームを解除 
        alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(getPendingIntent(id));
        // DBのアラームフラグをOFFにセット
        DatabaseUtils.alarmContents(context, id, 0);
        
		// メッセージを表示
		Toast.makeText(context, "アラームを解除しました", Toast.LENGTH_SHORT).show();	
        
   }
  
   /** アラームが鳴る時の設定 */
   private PendingIntent getPendingIntent(int id) {
         // 起動するアプリケーションを登録 
         Intent intent = new Intent( context.getApplicationContext(), AlarmInfoActivity.class );
         intent.putExtra(Defines.DATA_ID, id);
         intent.setType(Integer.toString(id));
         PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT );
         return pendingIntent;
   }
   
}
